package co.edu.usbcali.unidades.modelo.control;

import co.edu.usbcali.unidades.dataaccess.daoFactory.XMLHibernateDaoFactory;
import co.edu.usbcali.unidades.dataaccess.sessionFactory.HibernateSessionFactory;
import co.edu.usbcali.unidades.exceptions.*;
import co.edu.usbcali.unidades.exceptions.ZMessManager.FindingException;
import co.edu.usbcali.unidades.modelo.*;
import co.edu.usbcali.unidades.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.unidades.utilities.FacesUtils;
import co.edu.usbcali.unidades.utilities.GoogleTest;
import co.edu.usbcali.unidades.utilities.Utilities;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * interface PersonaLogic
 * 
 * @author Zathura Code Generator http://code.google.com/p/zathura
 * 
 */
public class PersonaLogic implements IPersonaLogic {
	public List<Persona> getPersona() throws Exception {
		List<Persona> list = new ArrayList<Persona>();

		try {
			list = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.findAll();
		} catch (Exception e) {
			throw new ZMessManager().new GettingException(ZMessManager.ALL
					+ "Persona");
		} finally {
		}

		return list;
	}

	public List<Persona> getAdminNombreParcial(String nombreParcial)
			throws Exception {
		if (nombreParcial.equals("")) {
			throw new ZMessManager().new EmptyFieldException(
					"Nombre Administrador");
		}

		if (!Utilities.isOnlyLetters(nombreParcial)) {
			throw new ZMessManager().new SoloLetrasException(
					"Nombre Administrador");
		}
		List<Persona> admins = new ArrayList<Persona>();
		try {
			Persona per = new Persona();
			per.setPerPrimerNom(nombreParcial);
			admins = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.getAdminNombreParcial(per);
			if (admins == null) {
				throw new ZMessManager().new FindingException("administradores");
			}
		} catch (Exception e) {
			throw e;
		}
		return admins;
	}

	// guarda admin y familiar
	public void savePersona(String perCedula, String perCelular,
        String perCorreo, String perPrimerApelli, String perPrimerNom,
        String perSegundoApelli, String perSegundoNom, String perTelefono,
        String estCodigo_Estado, String tipCodigoDoc_TipoDocumento,
        String tipCodigoP_TipoPersona) throws Exception {
        Persona entity = null;

        try {
        	
        	if(perPrimerNom.equals("")){
        		throw new ZMessManager(). new EmptyFieldException("Primer Nombre");
        	}
        	
        	if (!Utilities.isOnlyLetters(perPrimerNom)){
        		throw new ZMessManager(). new SoloLetrasException("Primer Nombre");
        	}
        	
        	if (!Utilities.isOnlyLetters(perSegundoNom)){
        		throw new ZMessManager(). new SoloLetrasException("Segundo Nombre");
        	}
        	
        	if(perPrimerApelli.equals("")){
        		throw new ZMessManager(). new EmptyFieldException("Primer Apellido");
        	}     
        	
        	if (!Utilities.isOnlyLetters(perPrimerApelli)){
        		throw new ZMessManager(). new SoloLetrasException("Primer Apellido");
        	}
        	
        	if(perSegundoApelli.equals("")){
        		throw new ZMessManager(). new EmptyFieldException("Segundo Apellido");
        	}   
        	
        	if (!Utilities.isOnlyLetters(perSegundoApelli)){
        		throw new ZMessManager(). new SoloLetrasException("Segundo Apellido");
        	}
        	
        	if (!Utilities.isNumeric(perCelular)){
        		throw new ZMessManager(). new NotValidFieldException("Celular");
        	}
        	
        	if (perCorreo.equals("")){
        		throw new ZMessManager().new EmptyFieldException("Correo");  
        	}
        	
        	if(!perCorreo.equals("")){
        		if (!Utilities.validateEmailAddress(perCorreo)){
        			throw new ZMessManager().new CorreoException();
        		}
        	}
           
            if ((perCedula != null) &&
                    (Utilities.checkWordAndCheckWithlength(perCedula, 10) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "perCedula");
            }

            if ((perCelular != null) &&
                    (Utilities.checkWordAndCheckWithlength(perCelular, 20) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "perCelular");
            }

            if ((perCorreo != null) &&
                    (Utilities.checkWordAndCheckWithlength(perCorreo, 30) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "perCorreo");
            }

            if (perPrimerApelli == null) {
                throw new ZMessManager().new EmptyFieldException(
                    "perPrimerApelli");
            }

            if ((perPrimerApelli != null) &&
                    (Utilities.checkWordAndCheckWithlength(perPrimerApelli, 30) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "perPrimerApelli");
            }

            if (perPrimerNom == null) {
                throw new ZMessManager().new EmptyFieldException("perPrimerNom");
            }

            if ((perPrimerNom != null) &&
                    (Utilities.checkWordAndCheckWithlength(perPrimerNom, 30) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "perPrimerNom");
            }

            if (perSegundoApelli == null) {
                throw new ZMessManager().new EmptyFieldException(
                    "perSegundoApelli");
            }

            if ((perSegundoApelli != null) &&
                    (Utilities.checkWordAndCheckWithlength(perSegundoApelli, 30) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "perSegundoApelli");
            }

            if ((perSegundoNom != null) &&
                    (Utilities.checkWordAndCheckWithlength(perSegundoNom, 30) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "perSegundoNom");
            }

            if ((perTelefono != null) &&
                    (Utilities.checkWordAndCheckWithlength(perTelefono, 20) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "perTelefono");
            }

            if (estCodigo_Estado == null) {
                throw new ZMessManager().new EmptyFieldException(
                    "estCodigo_Estado");
            }

            if ((estCodigo_Estado != null) &&
                    (Utilities.checkWordAndCheckWithlength(estCodigo_Estado, 10) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "estCodigo_Estado");
            }

            if (tipCodigoDoc_TipoDocumento == null) {
                throw new ZMessManager().new EmptyFieldException(
                    "tipCodigoDoc_TipoDocumento");
            }

            if ((tipCodigoDoc_TipoDocumento != null) &&
                    (Utilities.checkWordAndCheckWithlength(
                        tipCodigoDoc_TipoDocumento, 10) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "tipCodigoDoc_TipoDocumento");
            }

            if (tipCodigoP_TipoPersona == null) {
                throw new ZMessManager().new EmptyFieldException(
                    "tipCodigoP_TipoPersona");
            }

            if ((tipCodigoP_TipoPersona != null) &&
                    (Utilities.checkWordAndCheckWithlength(
                        tipCodigoP_TipoPersona, 10) == false)) {
                throw new ZMessManager().new NotValidFormatException(
                    "tipCodigoP_TipoPersona");
            }

            IEstadoLogic logicEstado1 = new EstadoLogic();
            ITipoDocumentoLogic logicTipoDocumento2 = new TipoDocumentoLogic();
            ITipoPersonaLogic logicTipoPersona3 = new TipoPersonaLogic();
            ITipoUsuarioLogic logicTipoUsuario = new TipoUsuarioLogic();
            IUsuarioLogic logicUsuario = new UsuarioLogic();
            
            Estado estadoClass = logicEstado1.getEstado(estCodigo_Estado);
            TipoDocumento tipoDocumentoClass = logicTipoDocumento2.getTipoDocumento(tipCodigoDoc_TipoDocumento);
            TipoPersona tipoPersonaClass = logicTipoPersona3.getTipoPersona(tipCodigoP_TipoPersona);
            TipoUsuario tipoUsuarioClass = logicTipoUsuario.getTipoUsuario(tipCodigoP_TipoPersona);
            
            
            if (estadoClass == null) {
                throw new ZMessManager().new ForeignException("Estado");
            }

            if (tipoDocumentoClass == null) {
                throw new ZMessManager().new ForeignException("Tipo Documento");
            }

            if (tipoPersonaClass == null) {
                throw new ZMessManager().new ForeignException("Tipo Persona");
            }

            entity = getPersona2(perCedula,tipCodigoDoc_TipoDocumento);

            if (entity != null && entity.getTipoPersona().getTipCodigoP().equals(tipCodigoP_TipoPersona)) {
                throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
            }else if(entity != null){
            	
            	if (tipoPersonaClass.getTipCodigoP().equals("5")){
            		Administrador entity2 = new Administrador();
            		entity2.setAdmCodigo(null);
            		entity2.setEstado(estadoClass);
            		entity2.setPersona(entity);
                 
            		HibernateSessionFactory.beginTransaction(); 
            		XMLHibernateDaoFactory.getInstance().getAdministradorDAO().save(entity2);
            		HibernateSessionFactory.commit();    
            	}
                                 
            }else{
            	entity = new Persona();
            	entity.setPerCedula(perCedula);
            	entity.setPerCelular(perCelular);
            	entity.setPerCorreo(perCorreo);
            	entity.setPerPrimerApelli(perPrimerApelli);
            	entity.setPerPrimerNom(perPrimerNom);
            	entity.setPerSegundoApelli(perSegundoApelli);
            	entity.setPerSegundoNom(perSegundoNom);
            	entity.setPerTelefono(perTelefono);
            	entity.setEstado(estadoClass);
            	entity.setTipoDocumento(tipoDocumentoClass);
            	entity.setTipoPersona(tipoPersonaClass);
            	
            	if (tipoPersonaClass.getTipCodigoP().equals("5")){
           
            		Administrador entity2 = new Administrador();
            		entity2.setAdmCodigo(null);
            		entity2.setEstado(estadoClass);
            		entity2.setPersona(entity);
            	
            		Usuario entity3 = new Usuario();
            		entity3.setEstado(estadoClass);
            		entity3.setPersona(entity);
            		entity3.setTipoUsuario(tipoUsuarioClass);
            		entity3.setUsuContrasena(logicUsuario.generarPass(8));
            		entity3.setUsuLogin(perCorreo);
            
            		HibernateSessionFactory.beginTransaction();            
            		XMLHibernateDaoFactory.getInstance().getPersonaDAO().save(entity);
            		XMLHibernateDaoFactory.getInstance().getAdministradorDAO().save(entity2);
            		XMLHibernateDaoFactory.getInstance().getUsuarioDAO().save(entity3);            	
            	
            		GoogleTest gt = new GoogleTest();
            		gt.sendSSLMessage(new String[]{entity.getPerCorreo()}, "Registro Unidad Residencial", "Su registro se ha efectuado correctamente\n" +
                		"Usuario: " + entity3.getUsuLogin() + "\n"+
                		"Password: " + entity3.getUsuContrasena(),
                 		"humberto", "humberto.guerrero1@gmail.com", "HAGUERRERO1090630");
            	}
            	if(tipoPersonaClass.getTipCodigoP().equals("6")){
            		HibernateSessionFactory.beginTransaction();     
            		XMLHibernateDaoFactory.getInstance().getPersonaDAO().save(entity);
            	}
                 
                 HibernateSessionFactory.commit();
            }
        } catch (Exception e) {
            HibernateSessionFactory.rollback();
            throw e;
        } finally {
            HibernateSessionFactory.closeSession();
        }
    }

	public void savePersonaPropietario(String perCedula, String perCelular,
			String perCorreo, String perPrimerApelli, String perPrimerNom,
			String perSegundoApelli, String perSegundoNom, String perTelefono,
			String estCodigo_Estado, String tipCodigoDoc_TipoDocumento,
			String tipCodigoP_TipoPersona, String codLocalizacion,
			String codInmueble) throws Exception {

		Persona entity = null;
		PropietarioInmueble entity2 = null;

		try {

			if (perPrimerNom.equals("")) {
				throw new ZMessManager().new EmptyFieldException(
						"Primer Nombre");
			}

			if (!Utilities.isOnlyLetters(perPrimerNom)) {
				throw new ZMessManager().new SoloLetrasException(
						"Primer Nombre");
			}

			if (!Utilities.isOnlyLetters(perSegundoNom)) {
				throw new ZMessManager().new SoloLetrasException(
						"Segundo Nombre");
			}

			if (perPrimerApelli.equals("")) {
				throw new ZMessManager().new EmptyFieldException(
						"Primer Apellido");
			}

			if (!Utilities.isOnlyLetters(perPrimerApelli)) {
				throw new ZMessManager().new SoloLetrasException(
						"Primer Apellido");
			}

			if (perSegundoApelli.equals("")) {
				throw new ZMessManager().new EmptyFieldException(
						"Segundo Apellido");
			}

			if (!Utilities.isOnlyLetters(perSegundoApelli)) {
				throw new ZMessManager().new SoloLetrasException(
						"Segundo Apellido");
			}

			if (!Utilities.isNumeric(perCelular)) {
				throw new ZMessManager().new NotValidFieldException("Celular");
			}

			if (perCorreo.equals("")) {
				throw new ZMessManager().new EmptyFieldException("Correo");
			}

			if (!perCorreo.equals("")) {
				if (!Utilities.validateEmailAddress(perCorreo)) {
					throw new ZMessManager().new CorreoException();
				}
			}

			if (codLocalizacion.equals("-1")) {
				throw new Exception("Seleccione una Localizacion");
			}

			if (codInmueble.equals("-1")) {
				throw new Exception("Seleccione un Inmueble");
			}

			if ((perCedula != null)
					&& (Utilities.checkWordAndCheckWithlength(perCedula, 10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perCedula");
			}

			if ((perCelular != null)
					&& (Utilities.checkWordAndCheckWithlength(perCelular, 20) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perCelular");
			}

			if ((perCorreo != null)
					&& (Utilities.checkWordAndCheckWithlength(perCorreo, 30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perCorreo");
			}

			if (perPrimerApelli == null) {
				throw new ZMessManager().new EmptyFieldException(
						"perPrimerApelli");
			}

			if ((perPrimerApelli != null)
					&& (Utilities.checkWordAndCheckWithlength(perPrimerApelli,
							30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perPrimerApelli");
			}

			if (perPrimerNom == null) {
				throw new ZMessManager().new EmptyFieldException("perPrimerNom");
			}

			if ((perPrimerNom != null)
					&& (Utilities.checkWordAndCheckWithlength(perPrimerNom, 30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perPrimerNom");
			}

			if (perSegundoApelli == null) {
				throw new ZMessManager().new EmptyFieldException(
						"perSegundoApelli");
			}

			if ((perSegundoApelli != null)
					&& (Utilities.checkWordAndCheckWithlength(perSegundoApelli,
							30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perSegundoApelli");
			}

			if ((perSegundoNom != null)
					&& (Utilities
							.checkWordAndCheckWithlength(perSegundoNom, 30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perSegundoNom");
			}

			if ((perTelefono != null)
					&& (Utilities.checkWordAndCheckWithlength(perTelefono, 20) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perTelefono");
			}

			if (estCodigo_Estado == null) {
				throw new ZMessManager().new EmptyFieldException(
						"estCodigo_Estado");
			}

			if ((estCodigo_Estado != null)
					&& (Utilities.checkWordAndCheckWithlength(estCodigo_Estado,
							10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"estCodigo_Estado");
			}

			if (tipCodigoDoc_TipoDocumento == null) {
				throw new ZMessManager().new EmptyFieldException(
						"tipCodigoDoc_TipoDocumento");
			}

			if ((tipCodigoDoc_TipoDocumento != null)
					&& (Utilities.checkWordAndCheckWithlength(
							tipCodigoDoc_TipoDocumento, 10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"tipCodigoDoc_TipoDocumento");
			}

			if (tipCodigoP_TipoPersona == null) {
				throw new ZMessManager().new EmptyFieldException(
						"tipCodigoP_TipoPersona");
			}

			if ((tipCodigoP_TipoPersona != null)
					&& (Utilities.checkWordAndCheckWithlength(
							tipCodigoP_TipoPersona, 10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"tipCodigoP_TipoPersona");
			}

			IEstadoLogic logicEstado1 = new EstadoLogic();
			ITipoDocumentoLogic logicTipoDocumento2 = new TipoDocumentoLogic();
			ITipoPersonaLogic logicTipoPersona3 = new TipoPersonaLogic();
			IInmuebleLogic logicInm = new InmuebleLogic();
			ITipoUsuarioLogic logicTipoUsuario = new TipoUsuarioLogic();
			IUsuarioLogic logicUsuario = new UsuarioLogic();

			Estado estadoClass = logicEstado1.getEstado(estCodigo_Estado);
			TipoDocumento tipoDocumentoClass = logicTipoDocumento2
					.getTipoDocumento(tipCodigoDoc_TipoDocumento);
			TipoPersona tipoPersonaClass = logicTipoPersona3
					.getTipoPersona(tipCodigoP_TipoPersona);
			Inmueble inmuebleClass = logicInm.getInmueble(codInmueble);
			TipoUsuario tipoUsuarioClass = logicTipoUsuario
					.getTipoUsuario(tipCodigoP_TipoPersona);

			if (estadoClass == null) {
				throw new ZMessManager().new ForeignException("estado");
			}

			if (tipoDocumentoClass == null) {
				throw new ZMessManager().new ForeignException("tipoDocumento");
			}

			if (tipoPersonaClass == null) {
				throw new ZMessManager().new ForeignException("tipoPersona");
			}

			entity = getPersona2(perCedula, tipCodigoDoc_TipoDocumento);

			if (entity != null
					&& entity.getTipoPersona().getTipCodigoP().equals(
							tipCodigoP_TipoPersona)) {
				throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
			} else if (entity != null) {
				entity2 = new PropietarioInmueble();
				entity2.setPriCodigo(null);
				entity2.setEstado(estadoClass);
				entity2.setInmueble(inmuebleClass);
				entity2.setPersona(entity);

				Cuenta cuenta = new Cuenta();
				cuenta.setCueCodCuenta(null);
				cuenta.setEstado(estadoClass);
				cuenta.setPropietarioInmueble(entity2);

				logicInm.updateInmueble(inmuebleClass.getInmCodigo(),
						inmuebleClass.getInmCuotaAdmin(), inmuebleClass
								.getInmDimension(), inmuebleClass
								.getInmNumeroId(), inmuebleClass.getDivision()
								.getDivCodigo(), "6");

				HibernateSessionFactory.beginTransaction();
				XMLHibernateDaoFactory.getInstance()
						.getPropietarioInmuebleDAO().save(entity2);
				XMLHibernateDaoFactory.getInstance().getCuentaDAO()
						.save(cuenta);
				HibernateSessionFactory.commit();

			} else {

				entity = new Persona();
				entity.setPerCedula(perCedula);
				entity.setPerCelular(perCelular);
				entity.setPerCorreo(perCorreo);
				entity.setPerPrimerApelli(perPrimerApelli);
				entity.setPerPrimerNom(perPrimerNom);
				entity.setPerSegundoApelli(perSegundoApelli);
				entity.setPerSegundoNom(perSegundoNom);
				entity.setPerTelefono(perTelefono);
				entity.setEstado(estadoClass);
				entity.setTipoDocumento(tipoDocumentoClass);
				entity.setTipoPersona(tipoPersonaClass);

				entity2 = new PropietarioInmueble();
				entity2.setPriCodigo(null);
				entity2.setEstado(estadoClass);
				entity2.setInmueble(inmuebleClass);
				entity2.setPersona(entity);

				Usuario entity3 = new Usuario();
				entity3.setEstado(estadoClass);
				entity3.setPersona(entity);
				entity3.setTipoUsuario(tipoUsuarioClass);
				entity3.setUsuContrasena(logicUsuario.generarPass(8));
				entity3.setUsuLogin(perCorreo);

				Cuenta cuenta = new Cuenta();
				cuenta.setCueCodCuenta(null);
				cuenta.setEstado(estadoClass);
				cuenta.setPropietarioInmueble(entity2);

				logicInm.updateInmueble(inmuebleClass.getInmCodigo(),
						inmuebleClass.getInmCuotaAdmin(), inmuebleClass
								.getInmDimension(), inmuebleClass
								.getInmNumeroId(), inmuebleClass.getDivision()
								.getDivCodigo(), "6");

				HibernateSessionFactory.beginTransaction();

				XMLHibernateDaoFactory.getInstance().getPersonaDAO().save(
						entity);
				XMLHibernateDaoFactory.getInstance()
						.getPropietarioInmuebleDAO().save(entity2);
				XMLHibernateDaoFactory.getInstance().getCuentaDAO()
						.save(cuenta);
				XMLHibernateDaoFactory.getInstance().getUsuarioDAO().save(
						entity3);

				GoogleTest gt = new GoogleTest();
				gt.sendSSLMessage(new String[] { entity.getPerCorreo() },
						"Registro Unidad Residencial",
						"Su registro se ha efectuado correctamente\n"
								+ "Usuario: " + entity3.getUsuLogin() + "\n"
								+ "Password: " + entity3.getUsuContrasena(),
						"humberto", "humberto.guerrero1@gmail.com",
						"HAGUERRERO1090630");

				HibernateSessionFactory.commit();
			}
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	public void updatePersonaAdmin(String perCedula, String perCelular,
			String perCorreo, String perPrimerApelli, String perPrimerNom,
			String perSegundoApelli, String perSegundoNom, String perTelefono,
			String estCodigo_Estado, String tipCodigoDoc_TipoDocumento,
			String tipCodigoP_TipoPersona) throws Exception {
		Persona entity = null;
		Usuario usu = null;

		try {
			if (perPrimerNom.equals("")) {
				throw new ZMessManager().new EmptyFieldException(
						"Primer Nombre");
			}

			if (!Utilities.isOnlyLetters(perPrimerNom)) {
				throw new ZMessManager().new SoloLetrasException(perPrimerNom);
			}

			if (!Utilities.isOnlyLetters(perSegundoNom)) {
				throw new ZMessManager().new SoloLetrasException(perSegundoNom);
			}

			if (perPrimerApelli.equals("")) {
				throw new ZMessManager().new EmptyFieldException(
						"Primer Apellido");
			}

			if (!Utilities.isOnlyLetters(perPrimerApelli)) {
				throw new ZMessManager().new SoloLetrasException(
						"Primer Apellido");
			}

			if (perSegundoApelli.equals("")) {
				throw new ZMessManager().new EmptyFieldException(
						"Segundo Apellido");
			}

			if (!Utilities.isOnlyLetters(perSegundoApelli)) {
				throw new ZMessManager().new SoloLetrasException(
						"Segundo Apellido");
			}

			if (perCorreo.equals("")) {
				throw new ZMessManager().new EmptyFieldException("Correo");
			}

			if (!perCorreo.equals("")) {
				if (!Utilities.validateEmailAddress(perCorreo)) {
					throw new ZMessManager().new CorreoException();
				}
			}

			if (perCedula == null) {
				throw new ZMessManager().new EmptyFieldException("perCedula");
			}

			if ((perCedula != null)
					&& (Utilities.checkWordAndCheckWithlength(perCedula, 10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"No. Documento");
			}

			if ((perCelular != null)
					&& (Utilities.checkWordAndCheckWithlength(perCelular, 20) == false)) {
				throw new ZMessManager().new NotValidFormatException("Celular");
			}

			if ((perCorreo != null)
					&& (Utilities.checkWordAndCheckWithlength(perCorreo, 30) == false)) {
				throw new ZMessManager().new NotValidFormatException("Correo");
			}

			if (perPrimerApelli == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Primer Apellido");
			}

			if ((perPrimerApelli != null)
					&& (Utilities.checkWordAndCheckWithlength(perPrimerApelli,
							30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"Primer Apellido");
			}

			if (perPrimerNom == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Primer Nombre");
			}

			if ((perPrimerNom != null)
					&& (Utilities.checkWordAndCheckWithlength(perPrimerNom, 30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"Primer Nombre");
			}

			if (perSegundoApelli == null) {
				throw new ZMessManager().new EmptyFieldException(
						"Segundo Apellido");
			}

			if ((perSegundoApelli != null)
					&& (Utilities.checkWordAndCheckWithlength(perSegundoApelli,
							30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"Segundo Apellido");
			}

			if ((perSegundoNom != null)
					&& (Utilities
							.checkWordAndCheckWithlength(perSegundoNom, 30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"Segundo Nombre");
			}

			if ((perTelefono != null)
					&& (Utilities.checkWordAndCheckWithlength(perTelefono, 20) == false)) {
				throw new ZMessManager().new NotValidFormatException("Telefono");
			}

			if (estCodigo_Estado == null) {
				throw new ZMessManager().new EmptyFieldException(
						"estCodigo_Estado");
			}

			if ((estCodigo_Estado != null)
					&& (Utilities.checkWordAndCheckWithlength(estCodigo_Estado,
							10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"estCodigo_Estado");
			}

			if (tipCodigoDoc_TipoDocumento == null) {
				throw new ZMessManager().new EmptyFieldException(
						"tipCodigoDoc_TipoDocumento");
			}

			if ((tipCodigoDoc_TipoDocumento != null)
					&& (Utilities.checkWordAndCheckWithlength(
							tipCodigoDoc_TipoDocumento, 10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"tipCodigoDoc_TipoDocumento");
			}

			if (tipCodigoP_TipoPersona == null) {
				throw new ZMessManager().new EmptyFieldException(
						"tipCodigoP_TipoPersona");
			}

			if ((tipCodigoP_TipoPersona != null)
					&& (Utilities.checkWordAndCheckWithlength(
							tipCodigoP_TipoPersona, 10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"tipCodigoP_TipoPersona");
			}

			IEstadoLogic logicEstado1 = new EstadoLogic();

			ITipoDocumentoLogic logicTipoDocumento2 = new TipoDocumentoLogic();

			ITipoPersonaLogic logicTipoPersona3 = new TipoPersonaLogic();
			Estado estadoClass = logicEstado1.getEstado(estCodigo_Estado);
			TipoDocumento tipoDocumentoClass = logicTipoDocumento2
					.getTipoDocumento(tipCodigoDoc_TipoDocumento);
			TipoPersona tipoPersonaClass = logicTipoPersona3
					.getTipoPersona(tipCodigoP_TipoPersona);

			if (estadoClass == null) {
				throw new ZMessManager().new ForeignException("estado");
			}

			if (tipoDocumentoClass == null) {
				throw new ZMessManager().new ForeignException("tipoDocumento");
			}

			if (tipoPersonaClass == null) {
				throw new ZMessManager().new ForeignException("tipoPersona");
			}
			
			
			entity = getPersona2(perCedula, tipCodigoDoc_TipoDocumento);			

			if (entity == null) {
				throw new ZMessManager(ZMessManager.ENTITY_NOENTITYTOUPDATE);
			}
			
			if (!entity.getPerCorreo().equals(perCorreo)){
				IUsuarioLogic usuLogic= new UsuarioLogic();				
				usu= usuLogic.getUsuarioPerCedula(perCedula);
				String pass=usuLogic.generarPass(8);
				GoogleTest g = new GoogleTest();
				g.sendSSLMessage(new String[] { perCorreo },
							"Registro Unidad Residencial",
							"Su registro se ha efectuado correctamente\n"
									+ "Usuario: " + perCorreo + "\n"
									+ "Password: " + pass,
							"humberto", "humberto.guerrero1@gmail.com",
							"HAGUERRERO1090630");
				
				usuLogic.updateUsuario(usu.getUsuCodigo(), pass,perCorreo, usu.getEstado().getEstCodigo(), entity.getPerCedula(), usu.getTipoUsuario().getTpuCodigo());
			}

			entity.setPerCedula(perCedula);
			entity.setPerCelular(perCelular);
			entity.setPerCorreo(perCorreo);
			entity.setPerPrimerApelli(perPrimerApelli);
			entity.setPerPrimerNom(perPrimerNom);
			entity.setPerSegundoApelli(perSegundoApelli);
			entity.setPerSegundoNom(perSegundoNom);
			entity.setPerTelefono(perTelefono);
			entity.setEstado(estadoClass);
			entity.setTipoDocumento(tipoDocumentoClass);
			entity.setTipoPersona(tipoPersonaClass);
			HibernateSessionFactory.beginTransaction();
			XMLHibernateDaoFactory.getInstance().getPersonaDAO().update(entity);
			
			HibernateSessionFactory.commit();
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	public void updatePersonaPropietario(String perCedula, String perCelular,
			String perCorreo, String perPrimerApelli, String perPrimerNom,
			String perSegundoApelli, String perSegundoNom, String perTelefono,
			String estCodigo_Estado, String tipCodigoDoc_TipoDocumento,
			String tipCodigoP_TipoPersona, String codLocalizacion,
			String codInmueble) throws Exception {
		Persona entity = null;
		PropietarioInmueble entity2 = null;
		Usuario usu = null;

		try {

			if (perPrimerNom.equals("")) {
				throw new ZMessManager().new EmptyFieldException(
						"Primer Nombre");
			}

			if (!Utilities.isOnlyLetters(perPrimerNom)) {
				throw new ZMessManager().new SoloLetrasException(
						"Primer Nombre");
			}

			if (!Utilities.isOnlyLetters(perSegundoNom)) {
				throw new ZMessManager().new SoloLetrasException(
						"Segundo Nombre");
			}

			if (perPrimerApelli.equals("")) {
				throw new ZMessManager().new EmptyFieldException(
						"Primer Apellido");
			}

			if (!Utilities.isOnlyLetters(perPrimerApelli)) {
				throw new ZMessManager().new SoloLetrasException(
						"Primer Apellido");
			}

			if (perSegundoApelli.equals("")) {
				throw new ZMessManager().new EmptyFieldException(
						"Segundo Apellido");
			}

			if (!Utilities.isOnlyLetters(perSegundoApelli)) {
				throw new ZMessManager().new SoloLetrasException(
						"Segundo Apellido");
			}

			if (!Utilities.isNumeric(perCelular)) {
				throw new ZMessManager().new NotValidFieldException("Celular");
			}

			if (perCorreo.equals("")) {
				throw new ZMessManager().new EmptyFieldException("Correo");
			}

			if (!perCorreo.equals("")) {
				if (!Utilities.validateEmailAddress(perCorreo)) {
					throw new ZMessManager().new CorreoException();
				}
			}

			if (codLocalizacion.equals("-1")) {
				throw new Exception("Seleccione una Localizaci�n");
			}

			if (codInmueble.equals("-1")) {
				throw new Exception("Seleccione un Inmueble");
			}

			if ((perCedula != null)
					&& (Utilities.checkWordAndCheckWithlength(perCedula, 10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"No. Documento");
			}

			if ((perCelular != null)
					&& (Utilities.checkWordAndCheckWithlength(perCelular, 20) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perCelular");
			}

			if ((perCorreo != null)
					&& (Utilities.checkWordAndCheckWithlength(perCorreo, 30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perCorreo");
			}

			if (perPrimerApelli == null) {
				throw new ZMessManager().new EmptyFieldException(
						"perPrimerApelli");
			}

			if ((perPrimerApelli != null)
					&& (Utilities.checkWordAndCheckWithlength(perPrimerApelli,
							30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perPrimerApelli");
			}

			if (perPrimerNom == null) {
				throw new ZMessManager().new EmptyFieldException("perPrimerNom");
			}

			if ((perPrimerNom != null)
					&& (Utilities.checkWordAndCheckWithlength(perPrimerNom, 30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perPrimerNom");
			}

			if (perSegundoApelli == null) {
				throw new ZMessManager().new EmptyFieldException(
						"perSegundoApelli");
			}

			if ((perSegundoApelli != null)
					&& (Utilities.checkWordAndCheckWithlength(perSegundoApelli,
							30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perSegundoApelli");
			}

			if ((perSegundoNom != null)
					&& (Utilities
							.checkWordAndCheckWithlength(perSegundoNom, 30) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perSegundoNom");
			}

			if ((perTelefono != null)
					&& (Utilities.checkWordAndCheckWithlength(perTelefono, 20) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"perTelefono");
			}

			if (estCodigo_Estado == null) {
				throw new ZMessManager().new EmptyFieldException(
						"estCodigo_Estado");
			}

			if ((estCodigo_Estado != null)
					&& (Utilities.checkWordAndCheckWithlength(estCodigo_Estado,
							10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"estCodigo_Estado");
			}

			if (tipCodigoDoc_TipoDocumento == null) {
				throw new ZMessManager().new EmptyFieldException(
						"tipCodigoDoc_TipoDocumento");
			}

			if ((tipCodigoDoc_TipoDocumento != null)
					&& (Utilities.checkWordAndCheckWithlength(
							tipCodigoDoc_TipoDocumento, 10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"tipCodigoDoc_TipoDocumento");
			}

			if (tipCodigoP_TipoPersona == null) {
				throw new ZMessManager().new EmptyFieldException(
						"tipCodigoP_TipoPersona");
			}

			if ((tipCodigoP_TipoPersona != null)
					&& (Utilities.checkWordAndCheckWithlength(
							tipCodigoP_TipoPersona, 10) == false)) {
				throw new ZMessManager().new NotValidFormatException(
						"tipCodigoP_TipoPersona");
			}

			IEstadoLogic logicEstado1 = new EstadoLogic();
			ITipoDocumentoLogic logicTipoDocumento2 = new TipoDocumentoLogic();
			ITipoPersonaLogic logicTipoPersona3 = new TipoPersonaLogic();
			IInmuebleLogic logicInm = new InmuebleLogic();

			Estado estadoClass = logicEstado1.getEstado(estCodigo_Estado);
			TipoDocumento tipoDocumentoClass = logicTipoDocumento2
					.getTipoDocumento(tipCodigoDoc_TipoDocumento);
			TipoPersona tipoPersonaClass = logicTipoPersona3
					.getTipoPersona(tipCodigoP_TipoPersona);
			Inmueble inmuebleClass = logicInm.getInmueble(codInmueble);

			if (estadoClass == null) {
				throw new ZMessManager().new ForeignException("estado");
			}

			if (tipoDocumentoClass == null) {
				throw new ZMessManager().new ForeignException("tipoDocumento");
			}

			if (tipoPersonaClass == null) {
				throw new ZMessManager().new ForeignException("tipoPersona");
			}

			entity = getPersona2(perCedula, tipCodigoDoc_TipoDocumento);

			if (entity != null) {
				throw new ZMessManager(ZMessManager.ENTITY_WITHSAMEKEY);
			}
			
			if (!entity.getPerCorreo().equals(perCorreo)){
				IUsuarioLogic usuLogic= new UsuarioLogic();				
				usu= usuLogic.getUsuarioPerCedula(perCedula);
				String pass=usuLogic.generarPass(8);
				GoogleTest g = new GoogleTest();
				g.sendSSLMessage(new String[] { perCorreo },
							"Registro Unidad Residencial",
							"Su registro se ha efectuado correctamente\n"
									+ "Usuario: " + perCorreo + "\n"
									+ "Password: " + pass,
							"humberto", "humberto.guerrero1@gmail.com",
							"HAGUERRERO1090630");
				
				usuLogic.updateUsuario(usu.getUsuCodigo(), pass,perCorreo, usu.getEstado().getEstCodigo(), entity.getPerCedula(), usu.getTipoUsuario().getTpuCodigo());
			}

			entity = new Persona();
			entity.setPerCedula(perCedula);
			entity.setPerCelular(perCelular);
			entity.setPerCorreo(perCorreo);
			entity.setPerPrimerApelli(perPrimerApelli);
			entity.setPerPrimerNom(perPrimerNom);
			entity.setPerSegundoApelli(perSegundoApelli);
			entity.setPerSegundoNom(perSegundoNom);
			entity.setPerTelefono(perTelefono);
			entity.setEstado(estadoClass);
			entity.setTipoDocumento(tipoDocumentoClass);
			entity.setTipoPersona(tipoPersonaClass);

			entity2 = new PropietarioInmueble();
			entity2.setPriCodigo(null);
			entity2.setEstado(estadoClass);
			entity2.setInmueble(inmuebleClass);
			entity2.setPersona(entity);

			HibernateSessionFactory.beginTransaction();

			XMLHibernateDaoFactory.getInstance().getPersonaDAO().update(entity);
			XMLHibernateDaoFactory.getInstance().getPropietarioInmuebleDAO()
					.update(entity2);
			HibernateSessionFactory.commit();
		} catch (Exception e) {
			HibernateSessionFactory.rollback();
			throw e;
		} finally {
			HibernateSessionFactory.closeSession();
		}
	}

	public Persona getPersona2(String perCedula, String tdoc) throws Exception {
		Persona entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.findByIdTpDoc(perCedula, tdoc);
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Persona");
		} finally {
		}

		return entity;
	}

	public Persona getPersona(String perCedula) throws Exception {
		Persona entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.findById(perCedula);
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Persona");
		} finally {
		}

		return entity;
	}

	public Persona getPersona3(String perCedula, String tpPersona, String TpDoc)
			throws Exception {
		Persona entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.findPersona(perCedula, tpPersona, TpDoc);
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Persona");
		} finally {
		}

		return entity;
	}

	public List<Persona> findPagePersona(String sortColumnName,
			boolean sortAscending, int startRow, int maxResults)
			throws Exception {
		List<Persona> entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.findPagePersona(sortColumnName, sortAscending, startRow,
							maxResults);
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Persona");
		} finally {
		}

		return entity;
	}

	public Long findTotalNumberPersona() throws Exception {
		Long entity = null;

		try {
			entity = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.findTotalNumberPersona();
		} catch (Exception e) {
			throw new ZMessManager().new FindingException("Persona Count");
		} finally {
		}

		return entity;
	}

	/**
	 * 
	 * @param varibles
	 *            este arreglo debera tener:
	 * 
	 *            [0] = String variable = (String) varibles[i]; representa como
	 *            se llama la variable en el pojo
	 * 
	 *            [1] = Boolean booVariable = (Boolean) varibles[i + 1];
	 *            representa si el valor necesita o no ''(comillas simples)usado
	 *            para campos de tipo string
	 * 
	 *            [2] = Object value = varibles[i + 2]; representa el valor que
	 *            se va a buscar en la BD
	 * 
	 *            [3] = String comparator = (String) varibles[i + 3]; representa
	 *            que tipo de busqueda voy a hacer.., ejemplo: where
	 *            nombre=william o where nombre<>william, en este campo iria el
	 *            tipo de comparador que quiero si es = o <>
	 * 
	 *            Se itera de 4 en 4..., entonces 4 registros del arreglo
	 *            representan 1 busqueda en un campo, si se ponen mas pues el
	 *            continuara buscando en lo que se le ingresen en los otros 4
	 * 
	 * 
	 * @param variablesBetween
	 * 
	 *            la diferencia son estas dos posiciones
	 * 
	 *            [0] = String variable = (String) varibles[j]; la variable ne
	 *            la BD que va a ser buscada en un rango
	 * 
	 *            [1] = Object value = varibles[j + 1]; valor 1 para buscar en
	 *            un rango
	 * 
	 *            [2] = Object value2 = varibles[j + 2]; valor 2 para buscar en
	 *            un rango ejempolo: a > 1 and a < 5 --> 1 seria value y 5 seria
	 *            value2
	 * 
	 *            [3] = String comparator1 = (String) varibles[j + 3];
	 *            comparador 1 ejemplo: a comparator1 1 and a < 5
	 * 
	 *            [4] = String comparator2 = (String) varibles[j + 4];
	 *            comparador 2 ejemplo: a comparador1>1 and a comparador2<5 (el
	 *            original: a > 1 and a < 5) *
	 * @param variablesBetweenDates
	 *            (en este caso solo para mysql) [0] = String variable =
	 *            (String) varibles[k]; el nombre de la variable que hace
	 *            referencia a una fecha
	 * 
	 *            [1] = Object object1 = varibles[k + 2]; fecha 1 a
	 *            comparar(deben ser dates)
	 * 
	 *            [2] = Object object2 = varibles[k + 3]; fecha 2 a
	 *            comparar(deben ser dates)
	 * 
	 *            esto hace un between entre las dos fechas.
	 * 
	 * @return lista con los objetos que se necesiten
	 * @throws Exception
	 */
	public List<Persona> findByCriteria(Object[] variables,
			Object[] variablesBetween, Object[] variablesBetweenDates)
			throws Exception {
		List<Persona> list = new ArrayList<Persona>();
		String where = new String();
		String tempWhere = new String();

		if (variables != null) {
			for (int i = 0; i < variables.length; i++) {
				if ((variables[i] != null) && (variables[i + 1] != null)
						&& (variables[i + 2] != null)
						&& (variables[i + 3] != null)) {
					String variable = (String) variables[i];
					Boolean booVariable = (Boolean) variables[i + 1];
					Object value = variables[i + 2];
					String comparator = (String) variables[i + 3];

					if (booVariable.booleanValue()) {
						tempWhere = (tempWhere.length() == 0) ? ("(model."
								+ variable + " " + comparator + " \'" + value + "\' )")
								: (tempWhere + " AND (model." + variable + " "
										+ comparator + " \'" + value + "\' )");
					} else {
						tempWhere = (tempWhere.length() == 0) ? ("(model."
								+ variable + " " + comparator + " " + value + " )")
								: (tempWhere + " AND (model." + variable + " "
										+ comparator + " " + value + " )");
					}
				}

				i = i + 3;
			}
		}

		if (variablesBetween != null) {
			for (int j = 0; j < variablesBetween.length; j++) {
				if ((variablesBetween[j] != null)
						&& (variablesBetween[j + 1] != null)
						&& (variablesBetween[j + 2] != null)
						&& (variablesBetween[j + 3] != null)
						&& (variablesBetween[j + 4] != null)) {
					String variable = (String) variablesBetween[j];
					Object value = variablesBetween[j + 1];
					Object value2 = variablesBetween[j + 2];
					String comparator1 = (String) variablesBetween[j + 3];
					String comparator2 = (String) variablesBetween[j + 4];
					tempWhere = (tempWhere.length() == 0) ? ("(" + value + " "
							+ comparator1 + " " + variable + " and " + variable
							+ " " + comparator2 + " " + value2 + " )")
							: (tempWhere + " AND (" + value + " " + comparator1
									+ " " + variable + " and " + variable + " "
									+ comparator2 + " " + value2 + " )");
				}

				j = j + 4;
			}
		}

		if (variablesBetweenDates != null) {
			for (int k = 0; k < variablesBetweenDates.length; k++) {
				if ((variablesBetweenDates[k] != null)
						&& (variablesBetweenDates[k + 1] != null)
						&& (variablesBetweenDates[k + 2] != null)) {
					String variable = (String) variablesBetweenDates[k];
					Object object1 = variablesBetweenDates[k + 1];
					Object object2 = variablesBetweenDates[k + 2];
					String value = null;
					String value2 = null;

					try {
						Date date1 = (Date) object1;
						Date date2 = (Date) object2;
						value = Utilities
								.formatDateWithoutTimeInAStringForBetweenWhere(date1);
						value2 = Utilities
								.formatDateWithoutTimeInAStringForBetweenWhere(date2);
					} catch (Exception e) {
						list = null;
						throw e;
					}

					tempWhere = (tempWhere.length() == 0) ? ("(model."
							+ variable + " between \'" + value + "\' and \'"
							+ value2 + "\')") : (tempWhere + " AND (model."
							+ variable + " between \'" + value + "\' and \'"
							+ value2 + "\')");
				}

				k = k + 2;
			}
		}

		if (tempWhere.length() == 0) {
			where = null;
		} else {
			where = "(" + tempWhere + ")";
		}

		try {
			list = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.findByCriteria(where);
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
		}

		return list;
	}

	public void deletePersona(String perCedula, String tpDoc) throws Exception {
		// TODO Auto-generated method stub

	}

	public Persona buscarPersonaPorCedulaCodigo(String NoDoc,String tipoUsuario) throws Exception {
		Persona p = null;

		try {
			p = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.buscarPersonaPorCedulaCodigo(NoDoc,tipoUsuario);
		} catch (Exception e) {
			throw e;
		} 
		return p;
	}

	public List<Persona> getPersonaVehiculo(String codPro) throws Exception {
		List<Persona> list = new ArrayList<Persona>();

		try {
			list = XMLHibernateDaoFactory.getInstance().getPersonaDAO()
					.getPersonaVehiculo(codPro);
		} catch (Exception e) {
			throw e;
		} 
		return list;
	}
	
}
